import http from 'http'
import { Server } from 'socket.io'
import express from 'express'

const app = express()
// 设置中间件允许跨域
app.use('*', (req, res, next) => {
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.setHeader("Access-Control-Allow-Headers", "*");
    res.setHeader("Access-Control-Allow-Methods", "*");
    next()
})
// const server = http.createServer()   // 可以用 http 创建服务，直接用
const server = http.createServer(app)   // 创建 http 服务， 将 express 挂载到 http 服务上
const io = new Server(server, {       // 创建 websocket服务
    cors: true //允许跨域
})
const groupList = {}           // 创建分组，存储房间信息
/**
 * room 就作为 key
 * {1:[{name,room,id}, {name,room,id}], 2:[{name,room,id}]}
 */
// io 是 事件模型驱动
io.on('connection', (socket) => {  // 回调函数，返回套接字
    //加入房间
    socket.on('join', ({ name, room }) => {   // 事件名称，前后端定义一致
        socket.join(room)   // 创建一个房间
        if (groupList[room]) {   // 判断房间是否存在
            groupList[room].push({ name, room, id: socket.id })   // 有了就push，添加成员
        } else {
            groupList[room] = [{ name, room, id: socket.id }]     // 没有就创建
        }
        socket.emit('groupList', groupList)   // 浏览器为维度的  发送消息，前后端的方法一样
        socket.broadcast.emit('groupList', groupList)   // 加 .to(room) 就指定房间(房间内看到)，不加就全局广播(所有人都能看到)  broadcast 广播
        // 管理员发个消息, 系统消息
        socket.broadcast.to(room).emit('message', { name: '管理员', msg: `${name}进入了房间` })  // 广播消息
    })
    //发送消息
    socket.on('message', ({ msg, room, name }) => {    // 监听消息, 参数前端后也要一致
        // 广播给房间的其他人，自己没法收到
        socket.broadcast.to(room).emit('message', {
            msg,
            name
        })
    })
    //断开链接内置事件
    socket.on('disconnect', () => {
        Object.keys(groupList).forEach(key => {
            let leval = groupList[key].find(item => item.id === socket.id)
            if (leval) {
                socket.broadcast.to(leval.room).emit('message', { name: '管理员', msg: `${leval.name}离开了房间` })
            }
            groupList[key] = groupList[key].filter(item => item.id !== socket.id)
        })
        socket.broadcast.emit('groupList', groupList)
    })
});

server.listen(3000, () => {
    console.log('listening on *:3000');
});
